package com.tmxk.api.days02.gull;

import com.tmxk.api.days01.gull.Dog;

import java.util.*;

/**
 * @Description: HashMap集合
 * @Author: gull
 * @CreateTime: 2022-11-29  10:35
 * @Version: 1.0
 */
public class HashMapDemo02 {
    public static void main(String[] args) {
        // ArrayList 和 LinkedList 默认容量初始大小是 10
        // HashMap 默认的容量初始大小是16
        // 语法:  Map<K,V> map = new HashMap<>();
        // K : key , 键,是唯一的 -- > Set接口下数据存储特点, 唯一、无序
        // V : value , 值,可重复  --> Collection接口下数据存储特点, 不唯一、无序
        // HashMap 是可以存储 null值
        /*
             dog1  小花   2
             dog2  花花   3
             dog3  小黑   1
             dog4  小白   5
             dog5  汪汪   6
         **/
        HashMap<String, Dog> hashMap = new HashMap<>();
        // 添加数据方法   HashMap集合对象名.put(key, value);
        // 使用HashMap集合 添加 5个 狗对象 , 迭代遍历 获取输出  狗狗名称  " -- " 狗狗年龄
        Dog dog1 = new Dog(10001, "小花", 2, 100, 50, 10.2);
        Dog dog2 = new Dog(10002, "花花", 3, 100, 50, 9.2);
        Dog dog3 = new Dog(10003, "小黑", 1, 100, 50, 3.5);
        Dog dog4 = new Dog(10004, "小白", 5, 50, 100, 8.9);
        Dog dog5 = new Dog(10005, "汪汪", 6, 90, 60, 11);

        hashMap.put(dog1.getName(), dog1);
        hashMap.put(dog2.getName(), dog2);
        hashMap.put(dog3.getName(), dog3);
        hashMap.put(dog4.getName(), dog4);
        hashMap.put(dog5.getName(), dog5);

        // 使用四种方式 循环迭代遍历
        // 通过 hashMap的values进行遍历
        System.out.println("通过hashMap的values进行遍历");
        Collection<Dog> valuesDog = hashMap.values();
        for (Dog dog : valuesDog) {
            System.out.println(dog.getId() + "--" + dog.getName() + " -- " + dog.getAge() + " -- " + dog.getWeight());
        }

        System.out.println("\t\t lambda表达式遍历 values");
        hashMap.values().forEach(dog -> {
            System.out.println(dog.getId() + "--" + dog.getName() + " -- " + dog.getAge() + " -- " + dog.getWeight());
        });

        // 通过hashMap的keySet进行遍历
        System.out.println("通过hashMap的keySet进行遍历");
        Set<String> keysDog = hashMap.keySet();
        for (String key : keysDog) {
            Dog dog = hashMap.get(key);
            System.out.println(dog.getId() + "--" + dog.getName() + " -- " + dog.getAge() + " -- " + dog.getWeight());
        }
        // lambda表达式遍历
        System.out.println("\t\t lambda表达式遍历 keySet()");
        hashMap.keySet().forEach(key -> {
            Dog dog = hashMap.get(key);
            System.out.println(dog.getId() + "--" + dog.getName() + " -- " + dog.getAge() + " -- " + dog.getWeight());
        });

        // 迭代器遍历
        System.out.println("迭代器遍历 ----> 迭代遍历 key");
        Iterator<String> itKey = keysDog.iterator();
        while (itKey.hasNext()) {
            String key = itKey.next();
            Dog dog = hashMap.get(key);
            System.out.println(dog.getId() + "--" + dog.getName() + " -- " + dog.getAge() + " -- " + dog.getWeight());
            // 常识: 集合对象不能在循环遍历中,执行remove()方法,会报java.util.ConcurrentModificationException, 可通过 迭代器进行 remove移除,因 迭代器专门为集合打造的
            // 移除"小花"元素
            if ("小花".equals(key)) {
                itKey.remove();
            }
        }
        System.out.println("迭代器遍历 ----> 迭代遍历 value");
        Iterator<Dog> itDog = valuesDog.iterator();
        while (itDog.hasNext()) {
            Dog dog = itDog.next();
            System.out.println(dog.getId() + "--" + dog.getName() + " -- " + dog.getAge() + " -- " + dog.getWeight());
        }

        // Map --> k , v 组成
        // entrySet() 获取一个 Map整体元素

        System.out.println("========== 输出hashMap集合元素  begin =================");
        System.out.println(hashMap);
        System.out.println("========== 输出hashMap集合元素  end =================");

        System.out.println("将hashMap集合作为一个整体输出");
        Set<Map.Entry<String, Dog>> setMap = hashMap.entrySet();
        setMap.forEach(map -> {
            System.out.println(map);
        });

        // 获取 "小白" 是否存在 hashMap 集合元素中
        // containsKey() : 获取map集合对象key 是否存在
        boolean isFindKey = hashMap.containsKey("小白");
        // containsValue : 获取map集合对象中 value 是否存在
        boolean isFindVal = hashMap.containsValue(dog1);
        System.out.println("isFindKey:" + isFindKey +"\t isFindVal"+  isFindVal);

        // 所有的集合都有一个清楚方法
        hashMap.clear();

        System.out.println("hashMap:" + hashMap);
    }
}
